package com.atguigu.mybatis.demo;

import com.atguigu.mybatis.bean.Employee;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

/**
 * Created by Smexy on 2022/11/9
 *          先连接数据库
 *  JDBC:  Connection
 *  Mybatis: SqlSession
 *                  提供工厂来创建。先建厂: SqlSessionFactory
 *
 *  -------------------------------
 *      封装规则：
 *         执行sql:  select * from employee where id = 1
 *
 *         返回结果:
 *              id  last_name  gender  email
 *             ------  ---------  ------  -------------
 *               1  Tom        male    Tom@163.com
 *
 *          根据resultType="com.atguigu.mybatis.bean.Employee"，封装Bean
 *             Employee e =  new Employee();
 *
 *          赋值: e.setXxx(yyy)
 *                  Xxx: 是返回的列名
 *                  yyy: 是返回的列值
 *
 *                  e.setId(1);
 *                  e.setLast_name(Tom);   //无法运行，找不到对应的setter
 *                  e.setGender(male);
 *                  e.setEmail(Tom@163.com);
 *
 *              Employee(id=1, lastName=null, gender=male, email=Tom@163.com)
 *
 *  --------------------------------
 *      解决:
 *              第一种： 在bean的类中提供对应的方法
 *              第二种： 为列起别名，让列名和提供的setter对应
 *                         提供 setLastName
 *                         列名:  lastName
 *
 *              第三种： 配置，让mybatis自动把不符合Java命名规范的列名转换为Java的命名规范
 *                          java： 驼峰式
 *                          sql :  下划线分割
 *
 *   -------------------------------
 *      目前存在的问题:
 *              ①调用的是sqlSession提供的API，不够灵活
 *              ②selectOne的  Object parameter，对参数类型是无法在编译时检查
 *                      在运行时可能会出错
 *              ③返回值的类型是Object，还得强转，麻烦
 *
 *       解决这个问题: 接口式编程
 *              自己写API，灵活。
 *              自己写API，明确声明参数类型，和返回值类型
 *
 *
 */
public class HelloWorld
{
    public static void main(String[] args) throws IOException {

        //定义全局配置文件
        String resource = "config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //获取一个连接
        SqlSession sqlSession = sqlSessionFactory.openSession();

        /*
            使用连接发送sql
                selectOne(String statement, Object parameter)
                        statement: 语句。 写的是语句的唯一标识(namespace.id)
                        parameter： 语句中传入的参数
         */
        Object o = sqlSession.selectOne("feichangbang.sql1", resource);

        Employee employee = (Employee) o;

        System.out.println(employee);

        //关闭连接
        sqlSession.close();
    }
}
